/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package modules.estoque.models.dao;

/**
 *
 * @author Clezio
 */
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import modules.estoque.models.dto.Produto;
import modules.estoque.util.HibernateUtil;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
   
 public class ProdutoDAO extends AbstractDAO{  
     
     private SessionFactory sessionFactory;
     
     public ProdutoDAO() throws Exception{
         sessionFactory = HibernateUtil.getSessionFactory();
     }
       
     public void save(Produto produto) throws Exception{
         Session session = sessionFactory.openSession();
         Transaction tx = session.beginTransaction();
         if(produto.getId() > 0){
            session.update(produto);
         }else{
            session.save(produto);
         }
         session.flush();
         tx.commit();
         session.close();  
     }  
       
     public java.util.List getList(String condicao) throws Exception{
         List<Produto> produtosDTO = new ArrayList<Produto>();
         Session session = sessionFactory.openSession();
         Query query = session.createQuery(condicao);
         List<Produto> produtos = query.list();
         for (int i = 0; i < produtos.size(); i++) {
             produtosDTO.add((Produto) montarDtoRetorno(produtos.get(i)));
         }
         session.flush();  
         session.close();  
         return produtosDTO;
     }  
       
     public Produto retrieve(Integer pk) throws Exception{
         Session session = sessionFactory.openSession();
         Produto produto = (Produto)session.load(Produto.class, pk);
         Produto produtoDTO = (Produto) montarDtoRetorno(produto);
         session.flush();
         session.close();  
         return produtoDTO;
     }  
       
     public void delete(Produto Produto) throws Exception{
         Session session = sessionFactory.openSession();
         Transaction tx = session.beginTransaction();
         session.delete(Produto);
         session.flush();
         tx.commit();
         session.close();  
     }

//    public Produto mountDto(Produto produto) {
//        Produto produtoDTO = new Produto();
//        produtoDTO.setId(produto.getId());
//        try {
//            produtoDTO.setFornecedores(new FornecedorDAO().mountDto(produto.getFornecedores()));
//        } catch (Exception ex) {
//            System.out.println("Erro: "+ex);
//            Logger.getLogger(ProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        try {
//            produtoDTO.setGruposProdutos(new GruposProdutoDAO().mountDto(produto.getGruposProdutos()));
//        } catch (Exception ex) {
//            System.out.println("Erro: "+ex);
//            Logger.getLogger(ProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
//        }
//        produtoDTO.setCodigo(produto.getCodigo());
//        produtoDTO.setDescricao(produto.getDescricao());
//        produtoDTO.setAltura(produto.getAltura());
//        produtoDTO.setLargura(produto.getLargura());
//        produtoDTO.setComprimento(produto.getComprimento());
//        produtoDTO.setAtivo(produto.isAtivo());
//        return produtoDTO;
//    }

    public Produto obterProdutoByCodigo(String codigo) {
        Session session = sessionFactory.openSession();
        Produto produto = (Produto) session.createCriteria(Produto.class)
            .add( Restrictions.eq("codigo", codigo.toUpperCase())).uniqueResult();
        Produto produtoDTO = null;
        if(produto != null){
            try {
                produtoDTO = (Produto) montarDtoRetorno(produto);
            } catch (Exception ex) {
                Logger.getLogger(ProdutoDAO.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }
        session.flush();
        session.close();
        return produtoDTO;
    }
 }